#include <func.h>

/*
    1. 守护进程定义：Daemon运行在后台也称作“后台服务进程”。 它是没有控制终端与之相连的进程。它独立与控制终端、
会话周期的执行某种任务。那么为什么守护进程要脱离终端后台运行呢？守护进程脱离终端是为了避免
进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的任何终端信息所打断。
那么为什么要引入守护进程呢？由于在linux中，每一个系统与用户进行交流的界面称为终端，每一个从
此终端开始运行的进程都会依赖这个终端，这个终端就称为这些进程的控制终端。当控制终端被关闭
时，相应的进程都会自动关闭。但是守护进程却能突破这种限制，它被执行开始运转，直到整个系统关
闭时才退出。几乎所有的服务器程序如Apache和wu-FTP，都用daemon进程的形式实现。很多Linux下
常见的命令如inetd和ftpd，末尾的字母d通常就是指daemon。

    2. 守护进程的特性：
        1. 守护进程最重要的特性是后台运行。
        2. 其次，守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会
    话和进程组、工作目录已经文件创建掩码等。这些环境通常是守护进程从父进程那里继承下来的。
        3. 守护进程的启动方式

    3. daemon进程的编程规则
        1. 创建子进程，父进程退出
        2. 在子进程中创建新会话



*/

void Daemon()
{
    // 1. 创建子进程，父进程退出
    if (fork())
    {
        exit(0);
    }

    // 2. 在子进程中创建新会话

    // 2.1 调用setsid()
    setsid();
    // 2.2 改变当前目录为根目录
    chdir("/");
    // 2.3 重设文件权限掩码
    umask(0);
    // 2.4 关闭所有不需要的文件描述符
    for (int i = 0; i < 3; i ++)
        close(i);
    
    // 3. 下面写守护进程要执行的功能
    printf("守护进程创建成功\n");
}

int main()
{
    Daemon();

    int fd = open("/tmp/log", O_RDWR | O_CREAT);
    while (1)
    {
        write(fd, "wohenshuai\n", 11);
        sleep(2);
    }

    return 0;
}